package com.esun.rabbit2.viewer.mainact.lotteryhallact.shiyixuanwu.rabbittrunk;

import java.util.ArrayList;
import java.util.BitSet;


/** 
* @ClassName: Combination 
* @Description: TODO(购彩拆单工具类) 
* @author Miko baoz@500wan.com
* @date 2011-1-13 下午09:27:21 
*  
*/
public class Combination {

	private static ArrayList<String> combList;

	private static void mn(String[] array, int n) {
		int m = array.length;
		if (m < n)
			throw new IllegalArgumentException("Error   m   <   n");
		BitSet bs = new BitSet(m);
		for (int i = 0; i < n; i++) {
			bs.set(i, true);
		}
		do {
			printAll(array, bs);
		} while (moveNext(bs, m));

	}

	/**
	 * 1、start 第一个true片段的起始位，end截止位 2、把第一个true片段都置false
	 * 3、数组从0下标起始到以第一个true片段元素数量减一为下标的位置都置true 4、把第一个true片段end截止位置true
	 * 
	 * @param bs
	 *            数组是否显示的标志位
	 * @param m
	 *            数组长度
	 * @return boolean 是否还有其他组合
	 */
	private static boolean moveNext(BitSet bs, int m) {
		int start = -1;
		while (start < m)
			if (bs.get(++start))
				break;
		if (start >= m)
			return false;

		int end = start;
		while (end < m)
			if (!bs.get(++end))
				break;
		if (end >= m)
			return false;
		for (int i = start; i < end; i++)
			bs.set(i, false);
		for (int i = 0; i < end - start - 1; i++)
			bs.set(i);
		bs.set(end);
		return true;
	}

	/**
	 * 输出生成的组合结果
	 * 
	 * @param array
	 *            数组
	 * @param bs
	 *            数组元素是否显示的标志位集合
	 */
	private static void printAll(String[] array, BitSet bs) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < array.length; i++)
			if (bs.get(i)) {
				
				if(array[i].length()<2){
					sb.append("0").append(array[i]).append(',');
				}else{
					sb.append(array[i]).append(',');
				}
			}
		sb.setLength(sb.length() - 1);
		combList.add(sb.toString());
	}


	/**
	 * 输出各种组合后的结果
	 * 
	 * @param string 数组
	 * @param many   选出其中的几个号为一组
	 * 
	 */
	public static String[] getCombination(String[] string, int many) {

		combList = new ArrayList<String>();
		
		mn(string, many);

		String[] str = new String[combList.size()];

		for (int i = 0; i < str.length; i++) {
			str[i] = combList.get(i);
		}

		return str;
	}
	
	/**
	 * 输出各种组合一共有多少种
	 * 
	 * @param string 数组
	 * @param many 选出其中的几个号为一组
	 * 
	 */
	public static int getCount(String[] string, int many){
	    
	    return LotteryUtils.getVoteline(string.length, many);
	    
//		return getCombination(string, many).length;
	}
}

// }  